<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>

    // 模拟封装封装数组的forEach
    // var list = [1, 4, 7, 2, 5, 8, 3, 6, 9];
    // function fn(item, index, array) {
    //     console.log(item, index, array);
    // }

    // for (var i = 0; i < list.length; i++) { // 循环调用函数
    //     var item = list[i];  //循环的当前元素
    //     var index = i;  // 循环的当前下标
    //     var array = list; // 原数组
    //     fn(item, index, array); // 实际参数
    // }


    /* function myEach(list, fn) {
        // var list = [1, 4, 7, 2, 5, 8, 3, 6, 9];
        // function fn(item, index, array) {
        //     console.log(item, index, array);
        // }
            
        for (var i = 0; i < list.length; i++) { // 循环调用函数
            var item = list[i];  //循环的当前元素
            var index = i;  // 循环的当前下标
            var array = list; // 原数组
            fn(item, index, array); // 实际参数  => 回调函数执行结束也会有结果
        }
    }

    // 遍历数组 每次循环时执行传入的回调函数 => 
    // 回调函数有三个参数 
    // item    循环的当前元素
    // index   循环的当前下标
    // array   原数组

    debugger;
    myEach(["a", "b", "c"], function (item, index, array) {
        console.log(item, index, array);
    })*/


    /* function myMap(list, fn) {
        // var list = [1, 4, 7, 2, 5, 8, 3, 6, 9];
        // function fn(item, index, array) {
        //     console.log(item, index, array);
        // }

        var arr = [];
        for (var i = 0; i < list.length; i++) { // 循环调用函数
            var item = list[i];  //循环的当前元素
            var index = i;  // 循环的当前下标
            var array = list; // 原数组
            var result = fn(item, index, array); // 实际参数  => 回调函数执行结束也会有结果
            arr.push(result);
        }
        return arr;
    }

    var result = myMap(["a", "b", "c"], function (item, index, array) {
        console.log(item, index, array);
        return item;
    });
    console.log(result); */


    /* function myFilter(list, fn) {
        // var list = [1, 4, 7, 2, 5, 8, 3, 6, 9];
        // function fn(item, index, array) {
        //     console.log(item, index, array);
        // }

        var arr = [];
        for (var i = 0; i < list.length; i++) { // 循环调用函数
            var item = list[i];  //循环的当前元素
            var index = i;  // 循环的当前下标
            var array = list; // 原数组
            var result = fn(item, index, array); // 实际参数  => 回调函数执行结束也会有结果
            if (result) {
                arr.push(item);  // 把满足条件的元素 放到新数组
            }
        }
        return arr;
    }

    var result = myFilter([1, 4, 7, 2, 5, 8, 3, 6, 9], function (item, index, array) {
        console.log(item, index, array);
        // return item % 2 == 0;
        return item % 2; // 0   1
    });
    console.log(result); */


    /* function mySome(list, fn) {
        // var list = [1, 4, 7, 2, 5, 8, 3, 6, 9];
        // function fn(item, index, array) {
        //     console.log(item, index, array);
        // }

        var flag = false; // 假设不存在
        for (var i = 0; i < list.length; i++) { // 循环调用函数
            var item = list[i];  //循环的当前元素
            var index = i;  // 循环的当前下标
            var array = list; // 原数组
            var result = fn(item, index, array); // 实际参数  => 回调函数执行结束也会有结果
            if (result) {
                flag = true;
                break;
            }
        }
        return flag;
    }

    var result = mySome([1, 4, 7, 2, 5, 8, 3, 6, 9], function (item, index, array) {
        console.log(item, index, array);
        return item % 3 == 0;
    });
    console.log(result); */


    /* function myEvery(list, fn) {
        // var list = [1, 4, 7, 2, 5, 8, 3, 6, 9];
        // function fn(item, index, array) {
        //     console.log(item, index, array);
        // }

        var flag = true; // 假设都满足
        for (var i = 0; i < list.length; i++) { // 循环调用函数
            var item = list[i];  //循环的当前元素
            var index = i;  // 循环的当前下标
            var array = list; // 原数组
            var result = fn(item, index, array); // 实际参数  => 回调函数执行结束也会有结果
            if (!result) { // 找到不满足条件的
                flag = false;
                break;
            }
        }
        return flag;
    }

    var result = myEvery([1, 4, 7, 2, 5, 8, 3, 6, 9], function (item, index, array) {
        console.log(item, index, array);
        // return item % 3 == 0;
        return item >= 0;
    });
    console.log(result); */



    function myFind(list, fn) {
        // var list = [1, 4, 7, 2, 5, 8, 3, 6, 9];
        // function fn(item, index, array) {
        //     console.log(item, index, array);
        // }

        for (var i = 0; i < list.length; i++) { // 循环调用函数
            var item = list[i];  //循环的当前元素
            var index = i;  // 循环的当前下标
            var array = list; // 原数组
            var result = fn(item, index, array); // 实际参数  => 回调函数执行结束也会有结果
            if (result) {
                return item;
            }
        }
    }

    function myFindIndex(list, fn) {
        // var list = [1, 4, 7, 2, 5, 8, 3, 6, 9];
        // function fn(item, index, array) {
        //     console.log(item, index, array);
        // }

        for (var i = 0; i < list.length; i++) { // 循环调用函数
            var item = list[i];  //循环的当前元素
            var index = i;  // 循环的当前下标
            var array = list; // 原数组
            var result = fn(item, index, array); // 实际参数  => 回调函数执行结束也会有结果
            if (result) {
                return index;
            }
        }
        return -1;
    }

    var result = myFind([1, 4, 7, 2, 5, 8, 3, 6, 9], function (item, index, array) {
        console.log(item, index, array);
        return item % 2 == 0;
    });
    console.log(result);
    
    var result = myFindIndex([1, 4, 7, 2, 5, 8, 3, 6, 9], function (item, index, array) {
        console.log(item, index, array);
        return item % 2 == 0;
    });
    console.log(result);

</script>

</html>